7章 スマートコントラクトとSolidity
7.1 スマートコントラクトとは何か?
1990年代に暗号学者のニック・ザボ(Nick Szabo)がこの用語を作った
「当事者が他の約束を実行する手順まで含んだ、デジタル形式で規定された一連の約束」と定義
顕著になったのは2009年、ビットコインを発明した分散型ブロックチェーンプラットフォーム
本書では「スマートコントラクト」という用語は、イーサリアム仮想マシンの文脈で、イーサリアムネットワークプロトコルの一部として、決定論的に実行される、イミュータブルなコンピュータプログラムを指します。
自動販売機の例がよく出てくる
用語の意味
コンピュータプログラム
スマートコントラクトは単純なコンピュータプログラム
イミュータブル
一度デプロイされると、コードを変更できない。スマートコントラクトを変更する唯一の方法は新しいコントラクトをデプロイし、それを利用すること
決定論的
実行を開始するトランザクションのコンテクストと、実行時のイーサリアムブロックチェーンの状態を前提に、スマートコントラクトの実行結果はトランザクションを実行するすべての人にとって同一になります
EVMのコンテクスト
スマートコントラクトは非常に限られたコンテクストで機能する。
分散型ワールドコンピュータ
EVMはすべてのローカルイーサリアムノード上でローカルインスタンスとして動作
同じ初期状態で動作、同じ最終状態を生成するのでシステム全体が一つの「ワールドコンピュータ」として動作
7.2 スマートコントラクトのライフサイクル
コントラクトはトランザクションによって呼び出された場合にのみ実行される
トランザクションはアトミック
すべての実行が正常に終了した場合のみ、グローバルな状態の変更が記録され、トランザクションが全体として実行されたことになる
失敗したらロールバックされる
実行に失敗したトランザクションは試行されたものとして記録され、事項のためにガスとして費やされたイーサは発信元アカウントから差し引かれる
7.5 イーサリアムコントラクトABI
7.6 Solidityを使ったプログラミング
サンプルコード
データ型
アドレス型とかあるの面白い。mapping型とかある
Time単位、Ether単位 は値リテラル
定義済みグローバル変数とグローバル関数
msg
msgオブジェクト
tx
トランザクションコンテクスト
block
ブロックコンテクスト
address
アドレスオブジェクト
組み込み関数
this 現在実行中のコントラクトアカウントのアドレスを返します
コントラクトの定義
関数
可視性 public, external, internal, private
やや誤解を招く表現です。
関数を呼び出す方法とタイミングのみ影響
constant, view, pure, payable
関数の動作に影響を与える
payableは入金を受け入れる
コンストラクタ
セルフディストラクト
関数修飾子
継承
エラーハンドリング assert, require, revert
イベント
他のコントラクトを呼び出す: send, call, callcode, delegatecall
7.7 ガスに関する検討事項
ガスリミットを超えたら一連のイベントが発生
Solidityのドキュメントより
オブジェクト指向の高級言語、静的型付け
スマートコントラクトのサンプルから学んで、その後に言語のコアを学びましょう
人間がソフトウェアを書くと、バグが発生する可能性があるので
確立されたソフトウェア開発のベストプラクティスに従う必要がある!
code review, testing, audits, and correctness proofs
本番に出す前には必ずセキュリティについて考慮しましょう
codeを書いた人よりもスマートコントラクトのユーザーの方がcodeに自信がある場合がある!!!
Introduction to Smart Contracts
code:Storage.sol
pragma solidity >=0.4.0 <0.7.0;
contract SimpleStorage {
uint storedData;
function set(uint x) public {
storedData = x;
}
function get() public view returns (uint) {
return storedData;
}
}
pragma
コントラクトが最新のコンパイラーバージョンでコンパイル可能でないことを保証(上の例だと0.7.0は含まない)
イーサリアム上の特定のアドレスに存在する、code(its functions)とdata(its state)の集合
状態変数としてstoredDataを宣言
uint (unsigned integer of 256 bits)
単一のデータベースのようなもの、setとgetができる
アクセスするのにthis.はいらない
メモ
Solidityのシンタックスハイライトほしいですね!kurotaky.icon
わかる june29.icon
hr.icon
次章!